﻿#ifndef _HY_DASHBOARD_H_
#define _HY_DASHBOARD_H_

/**
* @file         hy_dashboard.h
* @brief        绘制仪表盘
* @author       chsh
* @date         2021-08-20
* @version      V1.0
* @copyright    HuaYanKeJi
*/

#include <QWidget>


//NAMESPACE_BEGIN

class HyDashboard : public QObject
{
	Q_OBJECT

public:
    enum class StyleType
    {
        STYLE_UNKNOWN=-1,   ///<　未知风格
        STYLE_DEFAULT,      ///<　默认风格 无色彩区域
        STYLE_INTERNET,     ///<　网络风格 稳态工况 三色区域
    };

public:
	HyDashboard(QObject *parent=nullptr);
	~HyDashboard();

public:
    ///　吸附到某个窗口
	bool	Attach(QWidget* widget);
    ///　绘制表盘
	void	DrawDial(QPainter *painter);

    ///　设置表盘中心点
    void    SetDialCenter(int x,int y){center_x_=x;center_y_=y;}
    ///　设置表盘半径
    void    SetDialSide(int side){dial_side_=side;}
    ///　设置表盘标题
    void    SetDialTitle(QString title){dial_title_=title;}
    ///　获取表盘当前值
    double  GetDialValue(){return current_double_value_;}
    ///　设置表盘当前值和精度
    void    SetDialValue(double value,int precision=1){current_double_value_=value;value_precision_=precision;}
    ///　设置表盘刻度值字体大小
    void    SetScaleNumberFontSize(int size){scale_number_font_size_=size;}
    ///　设置表盘风格
    void    SetStyle(StyleType style){current_style_=style;}
    ///　设置表盘数值单位
    void    SetScaleUnit(QString unit){scale_units_=unit;}
    ///　设置表盘指针颜色
    void    SetNeedleColor(QColor color){needle_color_=color;}
    ///　设置表盘背景颜色
    void    SetDialBackgroundColor(QColor color){dial_backgroud_brush_=color;}
	///  设置表盘范围
	void	SetDialRange(int min_value, int max_value);

private:
    Q_DISABLE_COPY(HyDashboard)
    ///　参数初始化
	void	initParam();
    ///　绘制表冠
	void	drawCrown(QPainter *painter);
    ///　绘制刻度
	void	drawScale(QPainter *painter);
    ///　绘制刻度值
	void	drawScaleNum(QPainter *painter);
    ///　绘制指针
	void	drawNumericValue(QPainter *painter);
    ///　绘制标题
	void	drawTitle(QPainter *painter);
    ///　绘制当前刻度值
	void	drawIndicator(QPainter *painter);

private:
    StyleType   current_style_;     ///<　表盘风格

    int		dial_radius_;           ///<　表盘半径,表盘大小均相对于200的比例
    int		dial_center_radius_;    ///< 表盘中心半径
    int		dial_edge_radius_;      ///< 表盘边缘半径

    int		scale_minor_count_;     ///< 大刻度中小刻度的总数
    int		scale_major_count_;     ///< 表盘上大刻度的总数

    int		start_angle_;           ///< 刻度值开始角度
    int		end_angle_;             ///< 刻度值结束角度

    int		max_value_;             ///< 最大刻度值
    int		min_value_;             ///< 最小刻度值
    int		current_int_value_;     ///< 当前整形值　后期如果有需求再考虑增加类型，暂时用浮点类型
    int     value_precision_;       ///< 当前值的精度，保留几位小数
    double	current_double_value_;  ///< 当前浮点值

    int     center_x_;              ///< 表盘中心X坐标
    int     center_y_;              ///< 表盘中心Y坐标
    int     dial_side_;             ///< 表盘边长
    int     scale_number_font_size_;///< 刻度值字体大小

    QString	dial_title_;            ///< 标题字符串
    QString	scale_units_;           ///< 当前值单位

    QBrush	dial_brush_;            ///< 表盘颜色
    QBrush	dial_backgroud_brush_;  ///< 表盘背景颜色
    QColor	scale_color_;           ///< 刻度颜色
    QColor	scale_number_color_;    ///< 刻度数字颜色
    QColor	text_color_;            ///< 标题字体颜色
    QColor  needle_color_;          ///< 指针颜色

    QWidget*	widget_;            ///< 需要吸附的窗口指针
};

//NAMESPACE_END
#endif //_HY_DASHBOARD_H_
